﻿namespace Sofire.Data
{
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Text;

    /// <summary>
    /// 表示一个实体集合的查询结果。
    /// </summary>
    /// <typeparam name="TEntity">实体的类型。</typeparam>
    public class EntityCollectionResult<TEntity> : EntityResultBase<DynamicEntityCollection<TEntity>>
        where TEntity : new()
    {
        #region Constructors

        /// <summary>
        /// 初始化 <see cref="Sofire.Data.EntityCollectionResult&lt;TEntity&gt;"/> 的新实例。
        /// </summary>
        /// <param name="tableResult">一个 <see cref="Sofire.Data.TableResult"/> 查询结果。</param>
        internal EntityCollectionResult(TableResult tableResult)
            : base(tableResult, tableResult.Value.CreateEntities<TEntity>())
        {
        }

        #endregion Constructors

        #region Methods

        /// <summary>
        /// 保存到数据库。
        /// </summary>
        /// <param name="refresh">指示一个值，表示是否重新将实体数据映射到对应的数据行。</param>
        /// <param name="continueUpdateOnError">指示在行更新过程中遇到错误时是否生成异常。如果要继续更新而不生成异常，则为 true，否则为 false。</param>
        /// <returns>返回更新的行数。如果返回一个 0 则表示当前返回值并改动，如果返回一个小于 0 的整数，则表示更新发生了异常。</returns>
        public override int Save(bool refresh, bool continueUpdateOnError)
        {
            if(this._Value != null && this._TableResult != null)
            {
                this.ToSuccessed();
                if(refresh) this._Value.Update();
                var r = this._TableResult.Update(continueUpdateOnError);
                this.ToFailded(this._TableResult.Exception);
                return r;
            }

            return -1;
        }

        /// <summary>
        /// 执行释放任务。
        /// </summary>
        protected override void Disposing()
        {
            base.Disposing();
            if(this._Value != null)
            {
                this._Value.Dispose();
            }
        }

        #endregion Methods
    }
}